home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 1 / Gold Medal Software Volume 1 (Gold Medal) (1994).iso / graphics / tierra40.arj / TIERRA / TCURSES.C < prev    next >
C/C++ Source or Header  |  1992-09-09  |  10KB  |  403 lines

  1.  
  2. /* ======================================================================*/
  3. /* tcurses.c 9-9-92 support for unix curses frontend for 
  4.    Tierra simulation,
  5.    Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life
  6.    written by Daniel pirone
  7.    v 1.0
  8. */
  9. /* ======================================================================*/
  10. void FEExit(ENO)
  11. I32s ENO;
  12. {sleep(1);endwin();exit(ENO);}
  13. /* ======================================================================*/
  14. void FECeol()
  15. {
  16. clrtoeol();
  17. }
  18. /* ======================================================================*/
  19. I16s FEGetc()
  20. {
  21. return getch();
  22. }
  23. /* ======================================================================*/
  24. void FEStartup()
  25. {
  26. /* called immediately after the soup_in file is read */
  27. /* an opportunity to interactively set soup_in vars */
  28. I8s tt;
  29.  
  30. initscr();
  31.  
  32. if ((LINES < 20) || (COLS < 80))
  33.    {
  34.    fprintf(stderr,"\nTIERRA: not enough space on screen ... \n");
  35.    FEExit(-666);
  36.    }
  37.  
  38. clear();
  39. /*
  40.  set up keyboard
  41.  */
  42. nonl(); cbreak(); noecho(); 
  43.  
  44. /* scrollok(); */
  45.  
  46. fe_width = COLS - 23;
  47. fe_lines = LINES -2 ;
  48. IMode = PLN_STATS;
  49. PLN_X = 0;
  50. PLN_Y = 2;
  51. MSG_X = 0;
  52. MSG_Y = PLN_Y;
  53. ERR_X = 0;
  54. ERR_Y = LINES -2;
  55. HLP_X = 0;
  56. HLP_Y = LINES -1;
  57.  
  58. /* Title screen */
  59. printw("\n\n\t\t\t\t      TIERRA\n");
  60. printw("\n\n\t\t\t\t     July  92\n");
  61. printw("\n\t\t\t     Artificial Life System\n\t\t\t\t\tBy\n");
  62. printw("\t\t\t\tDr. Thomas S. Ray\n\t\t\t\t\t&\n");
  63. printw("\t\t    Daniel Pirone, Tom Uffner & Marc Cygnus\n\n");
  64. refresh();
  65. sleep(0); 
  66. clear();
  67. /* nice stats banner stuff */
  68. standout();
  69. for(tt = 0; tt < COLS-1; tt++)
  70.    {
  71.    mvaddch(0,tt,' ');
  72.    mvaddch(1,tt,' ');
  73.    mvaddch(ERR_Y,tt,' ');
  74.    mvaddch(LINES-1,tt,' ');
  75.    }
  76. standend();
  77. /* FEPrintf(HLP_X+15,HLP_Y,1,"Press Interupt Key for menu ..."); */
  78. FEPrintf(HLP_X+15,HLP_Y,1,"Tierra initializing, please wait ...");
  79. refresh();
  80.  
  81. }
  82. /* ======================================================================*/
  83. #ifdef __GNUC__
  84. void FEPrintf(I32s scr_x, I32s scr_y, I32s scr_a, ... )
  85. #else
  86. void FEPrintf(scr_x, scr_y, scr_a, va_alist )
  87. I32s scr_x, scr_y, scr_a;
  88. va_dcl
  89. #endif /*__GNUC__ */
  90. {
  91.     va_list ap;
  92.  
  93.     I8s *msg_str,
  94.         buf[80];
  95.     if((scr_x < 0) || (scr_x > COLS) || (scr_y < 0) || (scr_y > LINES))
  96.        {fprintf(stderr,"\0x07"); return ; }
  97.     if (scr_a) standout();
  98.  
  99. #ifdef __GNUC__
  100.     va_start(ap,acr_a);
  101. #else
  102.     va_start(ap);
  103. #endif /*__GNUC__*/
  104.     if ((msg_str = va_arg(ap, I8s *)) != NULL)
  105.        {
  106.        vsprintf(buf,msg_str,ap);
  107.        mvprintw(scr_y,scr_x,buf);
  108.        }
  109.     va_end(ap);
  110.     if (scr_a) standend();
  111.     refresh();
  112.  
  113. }
  114. /* ======================================================================*/
  115. void FEStats()
  116. { if (GeneBnker)
  117.   { FEPrintf(0,0,1,
  118.     "InstExec  = %ld,%6.6ld  Cells = %4ld  Genotypes = %4ld  Sizes =%4ld ",
  119.         InstExe.m,InstExe.i,NumCells, NumGenotypes, NumSizes);
  120.     FEPrintf(0,1,1, 
  121.       "Extracted = %-20.20s                                                ",
  122.       ExtrG);
  123.   }
  124.   else /* (GeneBnker) */
  125.   { FEPrintf(0,0,1, "InstExec  = %ld,%6.6ld  Cells = %4ld ",
  126.         InstExe.m,InstExe.i,NumCells);
  127.   }
  128. }
  129. /* ======================================================================*/
  130.  
  131. /*-----------------------------------------------------------------------*/
  132. void T_sig_int(sig,code,scp,addr)
  133.     I32s  sig,code;
  134.     /* struct sigcontext *scp; */
  135.     I32s *scp; /* DO NOT USE !!!!! */
  136.     I8s  *addr;
  137. {
  138. TC_Menu =1;
  139. }
  140. /*-----------------------------------------------------------------------*/
  141.  
  142. void FEMenu ()
  143. {
  144.    I8s  answer;
  145.    I32s tsz;
  146.    I8s  data[85];
  147.  
  148.    signal(2,T_sig_int);
  149.    touchwin(stdscr);
  150.    refresh();
  151.    while(1)
  152.       {
  153.       FEPrintf(HLP_X,HLP_Y,1,
  154. "TIERRA |  i-info  v-var  s-save  q-save&quit  Q-quit  m-misc c-continue |->"
  155.       );
  156.  
  157.       answer = mvgetch(HLP_Y,HLP_X+31);
  158.  
  159.       if (answer == 'c') 
  160.           {
  161.           FEPrintf(ERR_X,ERR_Y,1,"\t\t\t\t\t\t\t\t\t\t");
  162.           break;
  163.           }
  164.  
  165.       if (answer == 'v')
  166.          {  
  167.      IMode = 69;
  168.          FEPrintf(MSG_X,MSG_Y,0,
  169.                   "To alter any global variable from soup_in, type\n");
  170.          FEPrintf(MSG_X,MSG_Y+1,0,
  171.                   "the variable name (using proper case), a space,\n");
  172.          FEPrintf(MSG_X,MSG_Y+2,0,
  173.                   "an equal sign, a space, and the new value.\n");
  174.          FEPrintf(MSG_X,MSG_Y+3,0,
  175.                   "Use no space at start of line.  Some examples:\n");
  176.          FEPrintf(MSG_X,MSG_Y+4,0, "alive = 0\n");
  177.          FEPrintf(MSG_X,MSG_Y+5,0, "DistProp = .6\n");
  178.          FEPrintf(MSG_X,MSG_Y+6,0,"GenebankPath = newpath/\n");
  179.          FEClrmsg(MSG_Y+7);
  180.          echo(); nl();nocbreak();
  181.          FEPrintf(HLP_X,HLP_Y-1,0," ");
  182.          clrtoeol();
  183.          fgets(data,84,stdin);
  184.          /* getstr(data); */
  185.          cbreak();noecho(); nonl();
  186.          if (!GetAVar(data))
  187.              FEError(-900,NOEXIT,NOWRITE,
  188.                  "Tierra T_sig_int() Not a valid soup_in variable: %s", data);
  189.          IMode = PLN_STATS;
  190.          ToggleLog(0L);
  191.          }
  192.    
  193.       if (answer == 'i')
  194.          {
  195.  
  196.          FEPrintf(0,1,1,
  197. #ifdef ALCOMM
  198. "Port = %5ld FreeBlocks = %6ld  FreeMemCurrent = %6ld seed = %ld   ",
  199.           VPORT,FreeBlocks, FreeMemCurrent,seed);
  200. #else
  201. "FreeBlocks = %6ld  FreeMemCurrent = %6ld seed = %ld   ",
  202.           FreeBlocks, FreeMemCurrent,seed);
  203. #endif
  204.          FEPrintf(HLP_X,HLP_Y,1,
  205. "INFO   |  p-plan  s-size_histo g-gen_histo m-mem_histo z-size_query     |->"
  206.      );
  207.          answer = mvgetch(HLP_Y,HLP_X+31);
  208.  
  209.          if (answer == 'z')
  210.             {
  211.             IMode = 69;
  212.             FEClrmsg(MSG_Y);
  213.             sprintf(mes[0],
  214.             "Enter a size class ( eg: 80 ) to examine -> ");
  215.             FEMessage(1,mes);
  216.             FEPrintf(HLP_X,HLP_Y-2,0," ");
  217.             echo(); nl();nocbreak();
  218.             fgets(data,84,stdin);
  219.             /* getstr(data); */
  220.             cbreak();noecho(); nonl();
  221.             sscanf(data,"%d", &tsz);
  222.             if (Hist != NULL)
  223.             {   thfree(Hist);
  224.                 Hist=NULL;
  225.             }
  226.             query_size((I16u)tsz);
  227.             IMode = PLN_STATS;
  228.             }
  229.          if (answer == 'p')
  230.             {  
  231.             IMode = 69;
  232.             sprintf(mes[0],
  233.             "Now in Plan Display mode, updated every million time steps \n");
  234.             FEMessage(1,mes);
  235.             if (Hist != NULL)
  236.             {   thfree(Hist);
  237.                 Hist=NULL;
  238.             }
  239.             IMode = PLN_STATS;
  240.             }
  241.          if (answer == 's')
  242.             {  
  243.             if(GeneBnker) 
  244.                {
  245.                IMode = SIZ_HIST;
  246.                query_species(fe_lines);
  247.                }
  248.             }
  249.          if (answer == 'm')
  250.             {  
  251.             if(GeneBnker) 
  252.                {
  253.                IMode = SIZM_HIST;
  254.                query_species(fe_lines);
  255.                }
  256.             }
  257.          if (answer == 'g')
  258.             {  
  259.             if(GeneBnker) 
  260.                {
  261.                IMode = GEN_HIST;
  262.                query_species(fe_lines);
  263.                }
  264.             }
  265.          answer = ' ';
  266.        } 
  267.       if (answer == 's')
  268.          {  
  269.          FEError(-901,NOEXIT,WRITE," ");
  270.          }
  271.       if (answer == 'q')
  272.          {  
  273.          FEError(-902,EXIT,WRITE," ");
  274.          }
  275.       if (answer == 'Q') FEExit(-1);
  276.       if (answer == 'm') 
  277.           {
  278.       IMode = 69;
  279.           FEClrmsg(MSG_Y);
  280.           FEPrintf(0,1,1,"VER=%1.2f INST=%d PLOIDY=%d  %s %s %s %s\n",
  281.                    VER,INST,PLOIDY,
  282. #ifdef ERROR
  283. "ERROR",
  284. #else
  285. "",
  286. #endif
  287. #ifdef MEM_PROF
  288. "MEM_PROF",
  289. #else
  290. "",
  291. #endif
  292. #ifdef MICRO
  293. "MICRO",
  294. #else
  295. "",
  296. #endif
  297. #ifdef ALCOMM
  298. "ALCOMM"
  299. #else
  300. ""
  301. #endif
  302.       );
  303.  
  304.           FEPrintf(HLP_X,HLP_Y,1,
  305. "MISC |  H-Histo Logging  I-Inject Gene %s  %s  |->\n",
  306.  
  307. #ifdef MICRO
  308.           "M-Micro Toggle",
  309. #else
  310.           "",
  311. #endif
  312. #ifdef ALCOMM
  313.           "P-ALmonD Pause"
  314. #else
  315.           ""
  316. #endif
  317.          );
  318.       answer = mvgetch(HLP_Y,HLP_X+31);
  319.          if (answer == 'H')
  320.             {  
  321.             HistPrint = (Log && !HistPrint)? 1 : 0;
  322.             sprintf(mes[0],
  323.              "%s \n",(Log)? (HistPrint)? "Logging Histograms \n": 
  324.                                          "NOT Logging Histograms \n" :
  325.                            "Log NOT on ! \n");
  326.             FEMessage(1,mes);
  327.             }
  328. #ifdef MICRO
  329.          if (answer == 'M') 
  330.              {
  331.              if(MC_step == -1L) MC_step = 0L;
  332.              else if(MC_step == 0L) MC_step = 1L;
  333.              else {MC_step =-1L; if(tfp_log != NULL) Log = 1L;}
  334.          sprintf(mes[0]," MICRO STEP Mode = %s\n",
  335.          (MC_step == -1)?"off": (MC_step == 1)?"keypress":"delay");
  336.          FEMessage(1,mes);
  337.              }
  338. #endif /* MICRO */
  339. #ifdef ALCOMM
  340.          if (answer == 'P') 
  341.              {
  342.              AL_run_flag = (AL_run_flag)?0:1; 
  343.          sprintf(mes[0]," ALmond Pause = %s\n",
  344.              (AL_run_flag)?"off": "on");
  345.          FEMessage(1,mes);
  346.              }
  347. #endif /* ALCOMM */
  348.          if (answer == 'I') 
  349.              {
  350.          sprintf(mes[0],"INJECT GENE TO RUNNING SIMULATION\n"); 
  351.          sprintf(mes[1],"Enter gene name ( eg 0080aaa) or \n"); 
  352.          sprintf(mes[2],"Enter ESC to cancel\n");
  353.          FEMessage(3,mes);
  354.              echo(); nl();nocbreak();
  355.              FEPrintf(HLP_X,HLP_Y-1,0," ");
  356.          clrtoeol();
  357.              fgets(data,84,stdin);
  358.              /* getstr(data); */
  359.              cbreak();noecho(); nonl();
  360.          if (data[0] != 0x1b) InjectFromBank(data, -1, 0);
  361.          sprintf(mes[0]," Attempted Injection of %30s done\n", data);
  362.          FEMessage(1,mes);
  363.          FEStats();
  364.              }
  365.           answer = ' ';
  366.       IMode = PLN_STATS;
  367.           }    /* end of misc */
  368.       }         /* end while loop */
  369.  
  370. standend();
  371. FEPrintf(HLP_X,HLP_Y,1,
  372. "\t\t\tPress Interupt Key for menu ...\t\t\t");
  373. refresh();
  374. TC_Menu =0;
  375.  
  376. }    /* end of FEMenu */
  377.  
  378. /*-----------------------------------------------------------------------*/
  379.  
  380. /* ======================================================================*/
  381. void FEClrmsg(n)
  382. I32s n;
  383. {
  384. I8s t;
  385. if(n <0) return;
  386. mvprintw(n,0," ");
  387. clrtobot();
  388. FEPrintf(HLP_X,HLP_Y,1,
  389. "                          Press Interupt Key for menu ...                    "
  390. );
  391.  
  392. /*
  393. for(t= n; ( t < fe_lines); t++)
  394.     {
  395.     FEPrintf(MSG_X,t,0," ");
  396.     FECeol();
  397.     }
  398. */
  399. }
  400. /* ======================================================================*/
  401. /* ======================================================================*/
  402.  
  403.